(*$S+*) (* WRITTEN BY STEVEN MALECHEK FOR APPLIED ENGINEERING ON JAN 12, 1984. *) (* Copyright (C) 1984, 1986 by Applied Engineering *) UNIT TIMEMASTERII; INTRINSIC CODE 26 DATA 27; INTERFACE VAR TIME : STRING[13]; TODAY : STRING[18]; PROCEDURE GETCLOCK; FUNCTION CLDAY : INTEGER; FUNCTION CLMONTH : INTEGER; FUNCTION CLDATE : INTEGER; FUNCTION CLYEAR : INTEGER; FUNCTION CLHOURS : INTEGER; FUNCTION CLMINUTES: INTEGER; FUNCTION CLSECONDS: INTEGER; IMPLEMENTATION TYPE BYTE = PACKED ARRAY [0..1] OF 0..255; DIRTY= RECORD CASE BOOLEAN OF TRUE : (INT: INTEGER); FALSE: (PTR: ^BYTE) END; VAR SLOT : INTEGER; X : INTEGER; FUNCTION READCLOCK(SELECT:INTEGER):INTEGER; EXTERNAL; FUNCTION CLDAY; BEGIN CLDAY:=READCLOCK(0) END; FUNCTION CLMONTH; BEGIN CLMONTH:=READCLOCK(1) END; FUNCTION CLDATE; BEGIN CLDATE:=READCLOCK(3) END; FUNCTION CLYEAR; BEGIN CLYEAR:=READCLOCK(5) END; FUNCTION CLHOURS; BEGIN CLHOURS:=READCLOCK(7) END; FUNCTION CLMINUTES; BEGIN CLMINUTES:=READCLOCK(9) END; FUNCTION CLSECONDS; BEGIN CLSECONDS:=READCLOCK(11) END; PROCEDURE GETCLOCK; VAR THISDAY,THISMONTH:STRING[3]; DT,YR:STRING[2]; H,M,S,PART:STRING[2]; HR:INTEGER; BEGIN CASE CLDAY OF 0:THISDAY:='SUN'; 1:THISDAY:='MON'; 2:THISDAY:='TUE'; 3:THISDAY:='WED'; 4:THISDAY:='THU'; 5:THISDAY:='FRI'; 6:THISDAY:='SAT' END; CASE CLMONTH OF 1:THISMONTH:='JAN'; 2:THISMONTH:='FEB'; 3:THISMONTH:='MAR'; 4:THISMONTH:='APR'; 5:THISMONTH:='MAY'; 6:THISMONTH:='JUN'; 7:THISMONTH:='JUL'; 8:THISMONTH:='AUG'; 9:THISMONTH:='SEP'; 10:THISMONTH:='OCT'; 11:THISMONTH:='NOV'; 12:THISMONTH:='DEC'; END; STR(CLDATE,DT); STR(CLYEAR,YR); IF LENGTH(YR) = 1 THEN YR:=CONCAT('0',YR); TODAY:=CONCAT(' ',THISDAY,' ',THISMONTH,' ',DT,', 19',YR,' '); HR:=CLHOURS; IF HR < 12 THEN PART:='AM' ELSE PART:='PM'; IF HR <= 12 THEN IF HR = 0 THEN BEGIN HR:=12; STR(HR,H) END ELSE STR(HR,H) ELSE STR(HR-12,H); STR(CLMINUTES,M); IF LENGTH(M) = 1 THEN M:=CONCAT('0',M); STR(CLSECONDS,S); IF LENGTH(S) = 1 THEN S:=CONCAT('0',S); TIME:=CONCAT(' ',H,':',M,':',S,' ',PART,' ') END; FUNCTION PEEK(ADDR:INTEGER):INTEGER; VAR TRICK : DIRTY; BEGIN TRICK.INT:=ADDR; PEEK:=TRICK.PTR^[0] END; BEGIN (* MAIN *) (* THIS PART IS THE INITIALIZATION PART OF THE UNIT. IT SEARCHES ALL OF THE SLOTS FOR THE PRESENCE OF THE TIMEMASTER II CLOCK. WHEN THE CLOCK IS FOUND THE SLOT INFORMATION IS PASSED TO THE ASSEMBLY ROUTINE. IF THE CLOCK IS NOT IN THE COMPUTER THEN THE CALLING PROGRAM WILL BE TERMINATED. *) X:=PEEK(-12289); (* CFFF STROBE *) SLOT:=0; FOR X:=1 TO 7 DO IF ((PEEK(-16350+X*256) = 248) AND (PEEK(-16348+X*256) = 104)) OR ((PEEK(-16384+X*256) = 8) AND (PEEK(-16383+X*256) = 120) AND (PEEK(-16130+X*256) = 178)) THEN SLOT:=X*16; X:=PEEK(-12289); IF SLOT = 0 THEN BEGIN PAGE(OUTPUT); WRITELN('THE TIMEMASTER CLOCK IS NOT IN THE COMPUTER'); EXIT(PROGRAM) END; GETCLOCK; (* PRESET TIME AND TODAY STRINGS *) END.